package com.yhsoft.common.job;

import cn.hutool.core.date.StopWatch;
import com.yhsoft.flim.service.ICinemaService;
import com.yhsoft.flim.service.IFlimService;
import com.yhsoft.flim.service.IHotMovieService;
import com.yhsoft.flim.service.IMoviePlansService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;

/**
 * 影院定时任务
 */
@Component
public class FlimJob {
    private final Log logger = LogFactory.getLog(FlimJob.class);

    @Autowired
    private ICinemaService iCinemaService;

    @Autowired
    private IHotMovieService iHotMovieService;

    @Autowired
    private IMoviePlansService iMoviePlansService;

    @Autowired
    private IFlimService iFlimService;
    /*
     * * 第一位，表示秒，取值0-59
     * * 第二位，表示分，取值0-59
     * * 第三位，表示小时，取值0-23
     * * 第四位，日期天/日，取值1-31
     * * 第五位，日期月份，取值1-12
     * * 第六位，星期，取值1-7，星期一，星期二...，注：不是第1周，第二周的意思
     *           另外：1表示星期天，2表示星期一。
     * * 第7为，年份，可以留空，取值1970-2099
     *
     * cron中，还有一些特殊的符号，含义如下：
     *
     * (*)星号：可以理解为每的意思，每秒，每分，每天，每月，每年...
     * (?)问号：问号只能出现在日期和星期这两个位置。
     * (-)减号：表达一个范围，如在小时字段中使用“10-12”，则表示从10到12点，即10,11,12
     * (,)逗号：表达一个列表值，如在星期字段中使用“1,2,4”，则表示星期一，星期二，星期四
     * (/)斜杠：如：x/y，x是开始值，y是步长，比如在第一位（秒） 0/15就是，从0秒开始，每15秒，最后就是0，15，30，45，60    另：星/y，等同于0/y
     *
     *列举一些示例：
     *
     *0 0 3**?每天3点执行
     *0 5 3**?每天3点5分执行
     *0 5 3?**每天3点5分执行，与上面作用相同
     *0 5/10 3**?每天3点的 5分，15分，25分，35分，45分，55分这几个时间点执行
     *0 10 3?*1每周星期天，3点10分 执行，注：1表示星期天
     *0 10 3?*1#3每个月的第三个星期，星期天 执行，#号只能出现在星期的位置
     */

    /**
     * 影院列表接口(建议一周同步一次)
     */
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0 10 3 ? * 1")
    //@Scheduled(fixedDelay = 120 * 60 * 1000)
    public void cinemasynJob() throws IOException {
        logger.info("【系统开启任务】同步影院列表接口");
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        iCinemaService.synJob();
        stopWatch.stop();

        System.out.println("【系统开启任务】同步影院列表接口用时:" + stopWatch.getTotalTimeMillis() + "毫秒");
    }

    /**
     * 热映影片列表接口(建议十二个小时同步一次)
     */
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0 10 3 ? * 1")
    //@Scheduled(fixedDelay = 120 * 60 * 1000)
    public void hotMovieJob() throws IOException {
        logger.info("【系统开启任务】热映影片列表接口");
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        iHotMovieService.synJob();
        stopWatch.stop();

        System.out.println("【系统开启任务】热映影片列表接口用时:" + stopWatch.getTotalTimeMillis() + "毫秒");
    }

    /**
     * 场次列表接口(建议一个小时同步一次)
     */
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0 10 3 ? * 1")
    // @Scheduled(fixedDelay = 120 * 60 * 1000)
    public void MoviePlansJob() throws IOException {
        logger.info("【系统开启任务】场次列表接口");

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        iMoviePlansService.synJob();

        stopWatch.stop();
        System.out.println("【系统开启任务】场次列表接口用时:" + stopWatch.getTotalTimeMillis() + "毫秒");
    }


    /**
     *
     * 电影票出票接口轮询，1分钟一次   TODO
     *
     */
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(fixedDelay = 1 * 60 * 1000)
    public void FlimPayConfirmJob() throws IOException {
        logger.info("【系统开启任务】电影票出票接口轮询");

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        iFlimService.synJob();

        stopWatch.stop();
        System.out.println("【系统开启任务】电影票出票接口轮询用时:" + stopWatch.getTotalTimeMillis() + "毫秒");
    }
}
